package hips;

/**
 * Interface que almacena el valor de un píxel de una imagen y proporciona una
 * serie de métodos necesarios en el algoritmo de segmentación utilizado
 * en la clase <i>hips.Partition</i>.
 */
public interface PixelValue<PixelValue_ extends PixelValue<PixelValue_>>{

	/**
	 * En aquellos canales en los que el valor sea menor en <i>p</i>, copia
	 * su valor.
	 */
	public void setLower(PixelValue_ p);

	/**
	 * En aquellos canales en los que el valor sea mayor en <i>p</i>, copia
	 * su valor.
	 */
	public void setGreater(PixelValue_ p);

	/**
	 * Devuelve <i>true</i> si en todos los canales el valor es menor o igual
	 * que el correspondiente en <i>p</i>. En caso contrario devuelve
	 * <i>false</i>.
	 */
	public boolean isLowerOrEqual(PixelValue_ p);

	/**
	 * Devuelve <i>true</i> si en todos los canales el valor es mayor o igual
	 * que el correspondiente en <i>p</i>. En caso contrario devuelve
	 * <i>false</i>.
	 */
	public boolean isGreaterOrEqual(PixelValue_ p);

	/**
	 * Devuelve <i>true</i> si en todos los canales el valor es igual que el
	 * correspondiente en <i>p</i>. En caso contrario devuelve
	 * <i>false</i>.
	 */
	public boolean isEqual(PixelValue_ p);

	/**
	 * Devuelve una instancia de <i>PixelValue</i> con la diferencia en cada
	 * canal entre este píxel y el almacenado en <i>p</i>.
	 */
	public PixelValue_ range(PixelValue_ p);
	
	/**
	 * Devuelve la diferencia en cada canal entre <i>p1</i> y <i>p2</i>.
	 * @return Devuelve <i>this</i>.
	 */
	public PixelValue_ range(PixelValue_ p1, PixelValue_ p2);

	/**
	 * Devuelve una representación textual del valor del píxel en el slice
	 * especificado.
	 * 
	 * @param slice
	 *  Índice del slice específicado.
	 */
	public String getString(int slice);

	/**
	 * Devuelve una representación textual del valor del píxel en todos
	 * los slices.
	 */
	public String getString();

	/**
	 * Asigna el valor <i>value</i> en el slice especificado.
	 */
	public void setValue(Number value, int slice);

	/**
	 * Asigna el valor <i>value</i> en los slice y channel especificados. 
	 */
	public void setValue(Number value, int slice, int channel);

	/**
	 * Obtiene el valor del píxel en el slice especificado.
	 */
	public Number getValue(int slice);

	/**
	 * Obtiene el valor del píxel en los slice y channel especificados.
	 */
	public Number getValue(int slice, int channel);

	/**
	 * Obtiene el valor mínimo de todos los canales.
	 */
	public Number minValue();

	/**
	 * Obtiene el valor máximo de todos los canales.
	 */
	public Number maxValue();

	/**
	 * Devuelve el número total de slices del píxel.
	 */
	public int getSlices();

	/**
	 * Suma a cada canal de este píxel lo almacenado en cada canal de
	 * <i>p</i>.
	 */
	public PixelValue_ add(PixelValue_ p);

	/**
	 * Suma a cada canal de este píxel lo almacenado en <i>value</i>.
	 */
	public PixelValue_ add(float value);

	/**
	 * Resta a cada canal de este píxel lo almacenado en cada canal de
	 * <i>p</i>.
	 */
	public PixelValue_ sub(PixelValue_ p);

	/**
	 * Resta a cada canal de este píxel lo almacenado en <i>value</i>.
	 */
	public PixelValue_ sub(float value);

	/**
	 * Divide cada canal de este píxel por lo almacenado en <i>value</i>.
	 */
	public PixelValue_ div(float value);

	/**
	 * Multiplica cada canal de este píxel por lo almacenado en <i>value</i>.
	 */
	public PixelValue_ mult(float value);
	
	/**
	 * Devuelve la suma de los valores de todos los slices y channels.
	 */
	public Number sum();

	/**
	 * Devuelve una nueva instancia de <i>PixelValue</i> con los mismos valores
	 * en todos los canales.
	 */
	public PixelValue_ copy();
}